// Ninf-G-XX, ver. 0.1
// Copyright 2011 National Institute of Advanced Industrial Science and Technology
// 
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef __NC_FUNCTION_INTERFACE_IMPL_H__
#define __NC_FUNCTION_INTERFACE_IMPL_H__

#include <iostream>
#include <string>
#include "FunctionInterface.hpp"
#include "ParamDesc.hpp"

namespace ninf { 
namespace lib {

class FunctionInterfaceImpl : public FunctionInterface {
public:
  /* protocol version */
  int versionMajor, versionMinor;

  /* module name */
  const char * moduleName;	

  /* entry name */
  const char * entryName;	

  /* number of Parameters */
  int nParams;

  /* array of Parameters */
  ParamDesc ** params;

  /* description of the function interface */
  const char * description;

  /* boolean: specify server side shrink */
  bool shrink;                           

  /** constructer */
  FunctionInterfaceImpl(DataInputStream & dis);

  FunctionInterfaceImpl():
    moduleName(NULL), entryName(NULL), description(NULL),
    shrink(false) {}

  FunctionInterfaceImpl(
    int versionMajor,
    int versionMinor,
    const char * moduleName,
    const char * entryName,
    int  nParams,
    ParamDesc ** params,
    const char * description,
    bool shrink);

  virtual ~FunctionInterfaceImpl(){}

  /** write out */
  void writeTo(DataOutputStream & dos);

  /** write out declaration */
  virtual void writeDeclaration(int tab, int index, FILE * fp);
  
	std::string getName() {return std::string(moduleName) + "/" + entryName; }

  virtual const char * getModuleName() {return moduleName;}
  virtual const char * getEntryName() {return entryName;}

  std::string getStubName(){return std::string("_stub_") + moduleName + "_" +
			 entryName;}

  int  getNParams() {return nParams;}

  void setupArgs(va_list ap, Arg * args);

  void setupStubArgs(Arg * args);
};
}
}
#endif 
